草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 封装 std::vector 以允许迭代但没有别的

我想在我的类中隐藏一个vector场,但允许通过它的元素轻松迭代,但没有别的。这样那个类(class)的客户就可以做for(autoelement:foo.getElements()){}但不是foo.getElements()[42];是否有一些简单的方法可以在不创建新的混淆类型的情况下实现这一目标? 最佳答案 我不能说什么是什么不是“新的混淆类型”。但这足以满足基于范围的for的需求:templateclassiterator_range{public:iterator_range(Iterbeg,Iterend):beg_(b

c++ - 为什么 C++ STL 中的算法、迭代器和容器是分离的

我不明白为什么他们在C++STL中将算法、迭代器和容器分开。如果在任何地方都大量使用模板,那么我们可以使用模板参数将所有内容集中在一个地方的类。我收到的一些文本解释说迭代器有助于算法与容器数据交互,但如果容器公开某种机制来访问它拥有的数据怎么办? 最佳答案 与M容器+N算法,通常需要M*N代码片段,但迭代器充当“胶水”,这可以减少到M+N代码片段。示例:在3个容器上运行2个算法std::listl={0,2,5,6,3,1};//C++11initializerlistsstd::vectorv={0,2,5,6,3,1};//C+

C++ std::list:迭代时删除/删除元素

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Canyouremoveelementsfromastd::listwhileiteratingthroughit?我在一个函数中有一个循环,它从头到尾遍历std::list。在每个周期中,我都会对当前列表条目执行一些检查,可能还会进行一些操作,在某些情况下,我想将其从列表中删除。现在,正如预期的那样,我的迭代器失效了。有什么方法可以解决这个问题,即在遍历列表时从列表中删除元素?

c++ - 在 C++ 中使用类似 Fortran 的格式迭代文本文件

我正在制作一个处理txt文件数据的应用程序。想法是txt文件可能有不同的格式,应该将其读入C++。一个例子可能是3I2,3X,I3,应该这样写:“首先我们有3个长度为2的整数,然后我们有3个空位,然后我们有1个长度的整数3.是否最好遍历文件,生成行,然后将行作为字符串遍历?什么是巧妙地迭代而忽略3个要忽略的点的有效方法?例如101112---100102113---101103114---102到:10,11,12,10010,21,13,10110,31,14,102 最佳答案 KyleKanos提供的链接很好;*scanf/*p

c++ - 从输入迭代器创建 C++ std::string 的性能

我正在做一些非常简单的事情:将整个文本文件从磁盘中提取到std::string中。我当前的代码基本上是这样做的:std::ifstreamf(filename);returnstd::string(std::istreambuf_iterator(f),std::istreambuf_iterator());这不太可能对程序产生任何性能影响,但我仍然很好奇这是否是一种缓慢的执行方式。字符串的构造是否存在涉及大量重新分配的风险?使用seekg()/tellg()计算文件大小和reserve()会不会更好(也就是更快)>在读取之前字符串中有那么多空间? 最佳答案

c++ - 我如何编写一个迭代器包装器来组合来自底层迭代器的顺序值组?

考虑以下顺序:1,2,3,4,5,6,7,8,9,10我有那个序列的输入迭代器。我想将这些迭代器包装在生成以下序列的迭代器上:(1,2),(3,4),(5,6),(7,8),(9,10)如果不清楚,这个序列是从原始序列开始的连续对连续元素的序列。虽然原始序列有10个元素,但这个元素有5个:每个元素都是从原始序列中的两个元素中获得的。我正在使用Boost的iterator_facade来实现它,但我对此有错误的尝试:templatestructpairing_iterator:boost::iterator_facade,std::array::value_type,2>,std::in

c++ - 如何使我的迭代器类看起来不像容器类?

前提假设我有一个容器类Box,它提供内部类const_iterator和iterator。因为我希望iterator可以转换为const_iterator,后者继承自前者:classBox{//...public:classconst_iterator:publicstd::iterator{/*...*/};classiterator:publicconst_iterator{/*...*/};//...};问题现在我想使用GoogleTest测试这些类。让我们断言begin()和end()不会返回相同的东西:constBoxa;EXPECT_NE(a.begin(),a.end()

c++ - 标准如何处理容器插入函数中的自引用迭代器?

在处理像std::vector这样的C++标准库容器时,它们基于范围的插入方法如何处理用户使用引用vector自身内容的迭代器?大概如果他们说vector::iterator已经存在,那么实现可以对这种情况进行特殊处理,但是如果它们是最终导致访问vector的用户定义类型,那么如何vector是否处理在评估范围时保持这些迭代器有效的问题?标准是否只是禁止引用范围内的vector?举个简单的例子,考虑一个value_type是size_t的迭代器,取消引用它的结果是插入到的vector的大小。structsilly_iterator{vector*v;unsignednumber;std

c++ - 为什么标准容器迭代器不重载 `->*` ?

显然,如果您重载->,->*不会自动工作,必须手动重载。除了->之外,为什么标准容器的迭代器不重载->*,强制使用(*i​​ter).*mem_ptr而不是iter->*mem_ptr?#include#includestructS{intx;};intmain(){std::vectorvec={{42}};automem_ptr=&S::x;std::cout*mem_ptr 最佳答案 需要注意的是,这些问题通常无法回答,以下是operator->*()可能不会过载的几个原因。尽管可能真正的答案是没有人想到它。如果这对您来说是一

c++ - vector 和列表的 end() 迭代器的语义

根据C++标准,如果vector的新大小超过其容量,则对vector调用push_back()会使迭代器失效,但在列表上它永远不会使迭代器失效。现在考虑以下代码片段:1.vectorv{1,2,3};v.reserve(100);for(inti:v){v.push_back(i);}2.listl{1,2,3};for(inti:l){l.push_back(i);}我用gcc4.8试了一下,发现代码1以v结束时为{1,2,3,1,2,3},但代码2运行进入无限循环。对我来说,解释似乎很简单:vector的end()迭代器指向一个内存位置,并且由于itisonlyevaluatedo